The Resource Description Framework (RDF) is a standard model for data interchange on the Internet. RDF allows for data expressions to be made in the form of triples. An RDF triple contains three components: a subject, a predicate, and an object. A subject in an RDF triple indicates what resource is described by the triple. A predicate in an RDF triple indicates characteristics of the resource, and may provide a relationship between the resource and the object of the RDF triple. For example, in the context of customer billing, the subject in an RDF triple could be an account, the predicate in the RDF triple could be an account balance, and the object in the RDF triple could be a numerical value reflecting a customer's account balance. By using this model, a database of RDF triples can be maintained that can be processed and shared across different applications. In addition, RDF databases have indices that relate resources to the triples for which the resources are subjects, predicates, or values. As such, complex queries can be made against an RDF database. However, because of the need to maintain a large number of indices and triples, RDF databases have traditionally suffered from a lack of scalability.
NoSQL databases are databases not based on the Structured Query Language (SQL). NoSQL databases can be designed to be linearly scalable by using several servers where data is distributed and replicated among the servers. Linearly scalable NoSQL databases typically access data using a primary key, which may be composed of one or more sub-keys (e.g., a row key and column key). In a key-value database, a key is used to look up a corresponding value, or “cell,” that can contain data.
In order to increase flexibility, NoSQL databases are sometimes arranged as two-dimensional tabular databases that are looked up using both a row key and a column key. That is, the primary key in a two-dimensional tabular database may comprise a row key and a column key. Looking up data in a two-dimensional tabular database typically requires either access to both a row key and column key that correspond to target data, or access to one of the row and column keys combined with a requirement to scan a substantial portion of the database. However, maintaining a plurality of indices while ensuring the indices are consistent with the indexed data may be costly in terms of performance. In order to ease index maintenance, applications that utilize typical two-dimensional tabular NoSQL databases will often be limited to a small number of indices, limiting the variety of queries that can be efficiently executed. In addition, the traditional linearly scalable NoSQL databases do not permit queries that join several pieces of data from different locations. Thus, while NoSQL databases may be implemented to be linearly scalable, NoSQL databases traditionally suffer from a lack of flexibility.